package cn.org.cute.ebocy.config;

/**
 * 参数名设置，并检查参数值的有效性
 * @Copyright©2011, 2011 EBO CHANGYOU Co.td. All rights reserved.
 * @Version 1.0.0
 * @since jdk1.6
 * @author xiaolei
 * @date 2011-12-13
 */
public class Param {
	
	// 序列化UID
	private static final long serialVersionUID = 7459685922696118064L;

	// 枚举OpenAPI的所有参数名
	public enum ParamName {	
		
		//基础
		APP_ID("app_id"),
		CALL_ID("call_id"),		
		AUTH_TOKEN("auth_token"),
		FORMAT("format"),
		METHOD("method"),
		EBOCY_SIG("ebocy_sig"),		
		COMPRESS("compress"),
		PF("pf"),
	
		//平台参数
		API_KEY("api_key"),
		SECRET_KEY("secret_key"),
		PLATFORM_NAME("platform_name"),
		ISFRIENDINFO("isFriendInfo"),
		
		//用户信息参数
		NAME("name"),
		GENDER("gender"),
		PICTURE("picture"),
		EMAIL("email"),
		BIRTHDAY("birthday"),
		VERIFIED("verified"),
		IS_VIP("is_vip"),
		IS_YEAR_VIP("is_year_vip"),
		VERIFIED_TYPE("verified_type"),
		LEVEL("level"),
		FANS("fans"),
		ONLINE("online"),
		RESULT("result"),
		
		//user.geInfo
		UID("uid"),
		USECACHE("usecache"),
		
		//isFriend
		FOPENID("fopenid"),
		
		//user.geInfos
		UIDS("uids"),
		
		//friends.getAppFriends
		INFOED("infoed"),
		
		//filterword
		CONTENT("content"),
		MSGID("msgid"),
		
		//pay.buyGoods
		PFKEY("pfkey"),
		PAYITEM("payitem"),
		GOODSMETA("goodsmeta"),
		GOODSURL("goodsurl"),
		TS("ts"),
		DEVICE("device"),
		APPMODE("appmode"),
		
		//page.isFan
		PAGE_ID("page_id");
		
		
		// 存储参数名字符串
		private String name; 
		
		private ParamName(String name) {
			this.name = name;
		}
		
		// 取得参数名字符串
		public String getName() {
			return name;
		}
		
		public String toString() {
			return name;
		}
	}
	
	// 参数名
	private ParamName key;
	// 参数值
	private String value;
	
	/**
	 * 根据key和value构造一个参数对象。
	 * 
	 * @param key 参数名
	 * @param value 参数值
	 * @throws OpenException 值value不满足key的格式要求
	 */
	public Param(ParamName key, String value) {
		this.key = key;
		this.value =  value;
		
		// 判断值value是否符合格式要求
		//boolean isValid = true;
		//TODO
		
			
	}
	/**
	 * @return 以  key=value 格式输出参数。
	 */
	public String toString() {
		StringBuilder buffer = new StringBuilder();
		// 已经限定了参数值value里面不会有特殊字符
		buffer.append(key.getName()).append("=").append(value);
		return buffer.toString();
	}
	
	
	/**
	 * 
	 * @return 以数组 格式输出
	 */
	public String[] toStringArray() {
		String[] toStringArray = new String[2];
		toStringArray[0]=key.getName();
		toStringArray[1]=value;
		return toStringArray;
	}
	

	
	/**
	 * 检测是否为十六进制非空字符串
	 * 
	 * @param value 待检测的字符串
	 * @return 检测结果
	 */
	private boolean isHex( String value ) {
		return value.matches("^[0-9A-Fa-f]+$"); 
	}
	
	/**
	 * 检测是否为整形数字
	 * 
	 * @param value 待检测的字符串
	 * @return 检测结果
	 */
	private boolean isInteger( String value) {
		try {
			Integer.valueOf(value);
			return true;
		} catch (Exception ex) {
			return false;
		}		
	}
	
	/**
	 * 检测是否为非负整数
	 * 
	 * @param value 待检测的字符串
	 * @return 检测结果
	 */
	private boolean isNonnegative( String value ) {
		try {
			if (Integer.valueOf(value) < 0 ) {
				return false;
			}
			return true;
		} catch (Exception ex) {
			return false;
		}
	}
	
	/**
	 * 检测是否为普通英文名字符串（字符、数字、下划线）
	 * 
	 * @param value 待检测的字符串
	 * @return 检测结果
	 */
	private boolean isNameString( String value ) {
		return (value.matches("^[_0-9A-Za-z]+$"));
	}
	
	
	public static void main(String[] args){
		//使用范例
		//System.err.println(Param.ParamName.APP_ID.name);
		System.err.println(Param.ParamName.APP_ID.getName());
	}
}
